package pe.edu.upc.matrix.dao;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.Collection;

import pe.edu.upc.matrix.modelo.MCategoria;
import pe.edu.upc.matrix.modelo.MMensaje;
import pe.edu.upc.matrix.modelo.MPersona;
import pe.edu.upc.matrix.modelo.MPublicacion;
import pe.edu.upc.matrix.util.UConexionBD;
import pe.edu.upc.matrix.excepcion.EExcepcionDAO;

public class DMensaje extends DBase {

	public MMensaje registrarPregunta(MMensaje mMensaje) throws EExcepcionDAO {
		
		String query = "insert into tb_mensaje(TXT_PREGUNTA, FE_PREGUNTA, ID_PERSONA, ID_PUBLICACION) values (?,?,?,?)";
		
		Connection con = null;
		PreparedStatement stmt = null;
		ResultSet rs = null;
		
		try {
			con = UConexionBD.obtenerConexion();
			stmt = con.prepareStatement(query);
			stmt.setString(1, mMensaje.getTxtPregunta());
			stmt.setDate(2, new java.sql.Date(mMensaje.getFePregunta().getTime()));
			stmt.setInt(3, mMensaje.getPersona().getIdPersona());
			stmt.setInt(4, mMensaje.getPublicacion().getIdPublicacion());
			int i = stmt.executeUpdate();
			if (i != 1) {
				throw new SQLException("No se puede registar la pregunta.");
			}
			// Obtener el ultimo id
			int id = 0;
			query = "select last_insert_id()";
			stmt = con.prepareStatement(query);
			rs = stmt.executeQuery();
			if (rs.next()) {
				id = rs.getInt(1);
			}
			mMensaje.setIdMensaje(id);

		} catch (SQLException e) {
			System.err.println(e.getMessage());
			throw new EExcepcionDAO(e.getMessage());
		} finally {
			this.cerrarResultSet(rs);
			this.cerrarStatement(stmt);
			this.cerrarConexion(con);
		}
		return mMensaje;
	}
	
	public MMensaje registrarRespuesta(MMensaje mMensaje) throws EExcepcionDAO {
		
		String query = "update tb_mensaje set TXT_RESPUESTA=? ,FE_RESPUESTA=? where ID_MENSAJE=?";
		
		Connection con = null;
		PreparedStatement stmt = null;
		
		try {
			con = UConexionBD.obtenerConexion();
			stmt = con.prepareStatement(query);
			stmt.setString(1, mMensaje.getTxtRespuesta());
			stmt.setDate(2, new java.sql.Date(mMensaje.getFeRespuesta().getTime()));
			stmt.setInt(3, mMensaje.getIdMensaje());
			int i = stmt.executeUpdate();
			if (i != 1) {
				throw new SQLException("No se pudo actualizar la pregunta.");
			}
		} catch (SQLException e) {
			System.err.println(e.getMessage());
			throw new EExcepcionDAO(e.getMessage());
		} finally {
			this.cerrarStatement(stmt);
			this.cerrarConexion(con);
		}
		return mMensaje;
	}
	
	public Collection<MMensaje> listarPreguntas(int idPersona) throws EExcepcionDAO {
		
		String query = "select P.ID_CATEGORIA, P.ID_PERSONA, P.NO_TITULO, P.NO_DESCRIPCION, "
				+ "P.ID_ESTADO_CONSERVACION, P.QTY_PUBLICACION, P.QTY_STOCK_PUBLICACION, P.ID_ESTADO_STOCK, P.QTY_PRECIO, "
				+ "P.FE_CREACION_PUBLICACION, P.QTY_DURACION_PUBLICACION, P.QTY_CLICK, P.ARC_IMAGEN1, P.ARC_IMAGEN2, P.ARC_IMAGEN3, "
				
				+ "C.NO_CATEGORIA, C.DE_CATEGORIA, C.ID_CATEGORIA_PADRE, "
				
				+ "PE.ID_TIPO_PERSONA, PE.NO_PERSONA, PE.NO_PATERNO, PE.NO_MATERNO, PE.ID_SEXO, PE.ID_TIPO_DOCUMENTO, PE.NU_DOCUMENTO, PE.NO_CORREO, PE.NU_CELULAR, PE.FE_NACIMIENTO, "
				
				+ "M.ID_MENSAJE, M.TXT_PREGUNTA, M.TXT_RESPUESTA, M.FE_PREGUNTA, M.FE_RESPUESTA, M.ID_PERSONA, M.ID_PUBLICACION, "
				
				+ "PER.ID_TIPO_PERSONA, PER.NO_PERSONA, PER.NO_PATERNO, PER.NO_MATERNO, PER.ID_SEXO, PER.ID_TIPO_DOCUMENTO, PER.NU_DOCUMENTO, PER.NO_CORREO, PER.NU_CELULAR, PER.FE_NACIMIENTO "

				+ "from tb_publicacion P, tb_categoria C, tb_persona PE, tb_mensaje M, tb_persona PER "
				
				+ "where P.ID_CATEGORIA = C.ID_CATEGORIA and P.ID_PERSONA = PE.ID_PERSONA and P.ID_PUBLICACION = M.ID_PUBLICACION and M.ID_PERSONA = PER.ID_PERSONA and M.TXT_RESPUESTA is null and P.ID_PERSONA = ?";
		
		Collection<MMensaje> lista = new ArrayList<MMensaje>();
		
		Connection con = null;
		PreparedStatement stmt = null;
		ResultSet rs = null;
		
		try {
			con = UConexionBD.obtenerConexion();
			stmt = con.prepareStatement(query);
			stmt.setInt(1, idPersona);
			rs = stmt.executeQuery();
			while (rs.next()) {
				MMensaje mensaje = new MMensaje();
				MPersona personaMensaje = new MPersona();
				MPublicacion mPublicacion = new MPublicacion();
				MCategoria mCategoria = new MCategoria();
				MPersona personaPublicacion = new MPersona();
				
				mCategoria.setIdCategoria(rs.getInt("P.ID_CATEGORIA"));
				mCategoria.setNoCategoria(rs.getString("C.NO_CATEGORIA"));
				mCategoria.setDeCategoria(rs.getString("C.DE_CATEGORIA"));
				mCategoria.setIdCategoriaPadre(rs.getInt("C.ID_CATEGORIA_PADRE"));
				
				personaPublicacion.setIdPersona(rs.getInt("P.ID_PERSONA"));
				personaPublicacion.setIdTipoPersona(rs.getInt("PE.ID_TIPO_PERSONA"));
				personaPublicacion.setNoPersona(rs.getString("PE.NO_PERSONA"));
				personaPublicacion.setNoPaterno(rs.getString("PE.NO_PATERNO"));
				personaPublicacion.setNoMaterno(rs.getString("PE.NO_MATERNO"));
				personaPublicacion.setIdSexo(rs.getInt("PE.ID_SEXO"));
				personaPublicacion.setIdTipoDocumento(rs.getInt("PE.ID_TIPO_DOCUMENTO"));
				personaPublicacion.setNuDocumento(rs.getString("PE.NU_DOCUMENTO"));
				personaPublicacion.setNoCorreo(rs.getString("PE.NO_CORREO"));
				personaPublicacion.setNuCelular(rs.getString("PE.NU_CELULAR"));
				personaPublicacion.setFeNacimiento(rs.getDate("PE.FE_NACIMIENTO"));
				
				mPublicacion.setIdPublicacion(rs.getInt("M.ID_PUBLICACION"));
				mPublicacion.setCategoria(mCategoria);
				mPublicacion.setPersona(personaPublicacion);
				mPublicacion.setNoTitulo(rs.getString("P.NO_TITULO"));
				mPublicacion.setNoDescripcion(rs.getString("P.NO_DESCRIPCION"));
				mPublicacion.setIdEstadoConservacion(rs.getInt("P.ID_ESTADO_CONSERVACION"));
				mPublicacion.setQtyPublicacion(rs.getInt("P.QTY_PUBLICACION"));
				mPublicacion.setQtyStockPublicacion(rs.getInt("P.QTY_STOCK_PUBLICACION"));
				mPublicacion.setIdEstadoStock(rs.getInt("P.ID_ESTADO_STOCK"));
				mPublicacion.setQtyPrecio(rs.getDouble("P.QTY_PRECIO"));
				mPublicacion.setFeCreacionPublicacion(rs.getDate("P.FE_CREACION_PUBLICACION"));
				mPublicacion.setQtyDuracionPublicacion(rs.getInt("P.QTY_DURACION_PUBLICACION"));
				mPublicacion.setQtyClick(rs.getInt("P.QTY_CLICK"));
				mPublicacion.setArcImagen1(rs.getString("P.ARC_IMAGEN1"));
				mPublicacion.setArcImagen2(rs.getString("P.ARC_IMAGEN2"));
				mPublicacion.setArcImagen3(rs.getString("P.ARC_IMAGEN3"));
				
				personaMensaje.setIdPersona(rs.getInt("M.ID_PERSONA"));
				personaMensaje.setIdTipoPersona(rs.getInt("PER.ID_TIPO_PERSONA"));
				personaMensaje.setNoPersona(rs.getString("PER.NO_PERSONA"));
				personaMensaje.setNoPaterno(rs.getString("PER.NO_PATERNO"));
				personaMensaje.setNoMaterno(rs.getString("PER.NO_MATERNO"));
				personaMensaje.setIdSexo(rs.getInt("PER.ID_SEXO"));
				personaMensaje.setIdTipoDocumento(rs.getInt("PER.ID_TIPO_DOCUMENTO"));
				personaMensaje.setNuDocumento(rs.getString("PER.NU_DOCUMENTO"));
				personaMensaje.setNoCorreo(rs.getString("PER.NO_CORREO"));
				personaMensaje.setNuCelular(rs.getString("PER.NU_CELULAR"));
				personaMensaje.setFeNacimiento(rs.getDate("PER.FE_NACIMIENTO"));
				
				mensaje.setIdMensaje(rs.getInt("M.ID_MENSAJE"));
				mensaje.setTxtPregunta(rs.getString("M.TXT_PREGUNTA"));
				mensaje.setTxtRespuesta(rs.getString("M.TXT_RESPUESTA"));
				mensaje.setFePregunta(rs.getDate("M.FE_PREGUNTA"));
				mensaje.setFeRespuesta(rs.getDate("M.FE_RESPUESTA"));
				mensaje.setPersona(personaMensaje);
				mensaje.setPublicacion(mPublicacion);
				
				lista.add(mensaje);
			}
		} catch (SQLException e) {
			System.err.println(e.getMessage());
			throw new EExcepcionDAO(e.getMessage());
		} finally {
			this.cerrarResultSet(rs);
			this.cerrarStatement(stmt);
			this.cerrarConexion(con);
		}
		return lista;
	}
	
	public MMensaje ObtenerMensaje(int idMensaje) throws EExcepcionDAO {
		
		String query = "select P.ID_CATEGORIA, P.ID_PERSONA, P.NO_TITULO, P.NO_DESCRIPCION, "
				+ "P.ID_ESTADO_CONSERVACION, P.QTY_PUBLICACION, P.QTY_STOCK_PUBLICACION, P.ID_ESTADO_STOCK, P.QTY_PRECIO, "
				+ "P.FE_CREACION_PUBLICACION, P.QTY_DURACION_PUBLICACION, P.QTY_CLICK, P.ARC_IMAGEN1, P.ARC_IMAGEN2, P.ARC_IMAGEN3, "
				
				+ "C.NO_CATEGORIA, C.DE_CATEGORIA, C.ID_CATEGORIA_PADRE, "
				
				+ "PE.ID_TIPO_PERSONA, PE.NO_PERSONA, PE.NO_PATERNO, PE.NO_MATERNO, PE.ID_SEXO, PE.ID_TIPO_DOCUMENTO, PE.NU_DOCUMENTO, PE.NO_CORREO, PE.NU_CELULAR, PE.FE_NACIMIENTO, "
				
				+ "M.ID_MENSAJE, M.TXT_PREGUNTA, M.TXT_RESPUESTA, M.FE_PREGUNTA, M.FE_RESPUESTA, M.ID_PERSONA, M.ID_PUBLICACION, "
				
				+ "PER.ID_TIPO_PERSONA, PER.NO_PERSONA, PER.NO_PATERNO, PER.NO_MATERNO, PER.ID_SEXO, PER.ID_TIPO_DOCUMENTO, PER.NU_DOCUMENTO, PER.NO_CORREO, PER.NU_CELULAR, PER.FE_NACIMIENTO "

				+ "from tb_publicacion P, tb_categoria C, tb_persona PE, tb_mensaje M, tb_persona PER "
				
				+ "where P.ID_CATEGORIA = C.ID_CATEGORIA and P.ID_PERSONA = PE.ID_PERSONA and P.ID_PUBLICACION = M.ID_PUBLICACION and M.ID_PERSONA = PER.ID_PERSONA and M.TXT_RESPUESTA is null and M.ID_MENSAJE = ?";
		
		MMensaje mensaje = new MMensaje();
		
		Connection con = null;
		PreparedStatement stmt = null;
		ResultSet rs = null;
		
		try {
			con = UConexionBD.obtenerConexion();
			stmt = con.prepareStatement(query);
			stmt.setInt(1, idMensaje);
			rs = stmt.executeQuery();
			while (rs.next()) {
				MPersona personaMensaje = new MPersona();
				MPublicacion mPublicacion = new MPublicacion();
				MCategoria mCategoria = new MCategoria();
				MPersona personaPublicacion = new MPersona();
				
				mCategoria.setIdCategoria(rs.getInt("P.ID_CATEGORIA"));
				mCategoria.setNoCategoria(rs.getString("C.NO_CATEGORIA"));
				mCategoria.setDeCategoria(rs.getString("C.DE_CATEGORIA"));
				mCategoria.setIdCategoriaPadre(rs.getInt("C.ID_CATEGORIA_PADRE"));
				
				personaPublicacion.setIdPersona(rs.getInt("P.ID_PERSONA"));
				personaPublicacion.setIdTipoPersona(rs.getInt("PE.ID_TIPO_PERSONA"));
				personaPublicacion.setNoPersona(rs.getString("PE.NO_PERSONA"));
				personaPublicacion.setNoPaterno(rs.getString("PE.NO_PATERNO"));
				personaPublicacion.setNoMaterno(rs.getString("PE.NO_MATERNO"));
				personaPublicacion.setIdSexo(rs.getInt("PE.ID_SEXO"));
				personaPublicacion.setIdTipoDocumento(rs.getInt("PE.ID_TIPO_DOCUMENTO"));
				personaPublicacion.setNuDocumento(rs.getString("PE.NU_DOCUMENTO"));
				personaPublicacion.setNoCorreo(rs.getString("PE.NO_CORREO"));
				personaPublicacion.setNuCelular(rs.getString("PE.NU_CELULAR"));
				personaPublicacion.setFeNacimiento(rs.getDate("PE.FE_NACIMIENTO"));
				
				mPublicacion.setIdPublicacion(rs.getInt("M.ID_PUBLICACION"));
				mPublicacion.setCategoria(mCategoria);
				mPublicacion.setPersona(personaPublicacion);
				mPublicacion.setNoTitulo(rs.getString("P.NO_TITULO"));
				mPublicacion.setNoDescripcion(rs.getString("P.NO_DESCRIPCION"));
				mPublicacion.setIdEstadoConservacion(rs.getInt("P.ID_ESTADO_CONSERVACION"));
				mPublicacion.setQtyPublicacion(rs.getInt("P.QTY_PUBLICACION"));
				mPublicacion.setQtyStockPublicacion(rs.getInt("P.QTY_STOCK_PUBLICACION"));
				mPublicacion.setIdEstadoStock(rs.getInt("P.ID_ESTADO_STOCK"));
				mPublicacion.setQtyPrecio(rs.getDouble("P.QTY_PRECIO"));
				mPublicacion.setFeCreacionPublicacion(rs.getDate("P.FE_CREACION_PUBLICACION"));
				mPublicacion.setQtyDuracionPublicacion(rs.getInt("P.QTY_DURACION_PUBLICACION"));
				mPublicacion.setQtyClick(rs.getInt("P.QTY_CLICK"));
				mPublicacion.setArcImagen1(rs.getString("P.ARC_IMAGEN1"));
				mPublicacion.setArcImagen2(rs.getString("P.ARC_IMAGEN2"));
				mPublicacion.setArcImagen3(rs.getString("P.ARC_IMAGEN3"));
				
				personaMensaje.setIdPersona(rs.getInt("M.ID_PERSONA"));
				personaMensaje.setIdTipoPersona(rs.getInt("PER.ID_TIPO_PERSONA"));
				personaMensaje.setNoPersona(rs.getString("PER.NO_PERSONA"));
				personaMensaje.setNoPaterno(rs.getString("PER.NO_PATERNO"));
				personaMensaje.setNoMaterno(rs.getString("PER.NO_MATERNO"));
				personaMensaje.setIdSexo(rs.getInt("PER.ID_SEXO"));
				personaMensaje.setIdTipoDocumento(rs.getInt("PER.ID_TIPO_DOCUMENTO"));
				personaMensaje.setNuDocumento(rs.getString("PER.NU_DOCUMENTO"));
				personaMensaje.setNoCorreo(rs.getString("PER.NO_CORREO"));
				personaMensaje.setNuCelular(rs.getString("PER.NU_CELULAR"));
				personaMensaje.setFeNacimiento(rs.getDate("PER.FE_NACIMIENTO"));
				
				mensaje.setIdMensaje(rs.getInt("M.ID_MENSAJE"));
				mensaje.setTxtPregunta(rs.getString("M.TXT_PREGUNTA"));
				mensaje.setTxtRespuesta(rs.getString("M.TXT_RESPUESTA"));
				mensaje.setFePregunta(rs.getDate("M.FE_PREGUNTA"));
				mensaje.setFeRespuesta(rs.getDate("M.FE_RESPUESTA"));
				mensaje.setPersona(personaMensaje);
				mensaje.setPublicacion(mPublicacion);
			}
		} catch (SQLException e) {
			System.err.println(e.getMessage());
			throw new EExcepcionDAO(e.getMessage());
		} finally {
			this.cerrarResultSet(rs);
			this.cerrarStatement(stmt);
			this.cerrarConexion(con);
		}
		return mensaje;
	}

}
